#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>

using namespace std;

//vector<int> findPeakGrid(vector<vector<int>>& mat) {
//    int n = mat.size(), m = mat[0].size();
//    int l = 0, r = n - 1;
//    vector<int> ans{ -1,-1 };
//    while (l <= r)
//    {
//        int i = l + r >> 1;
//        int j = max_element(mat[i].begin(), mat[i].end()) - mat[i].begin();
//        if (i >= 1 && mat[i][j] < mat[i - 1][j])
//            r = i - 1;
//        else if (i + 1 < n && mat[i][j] < mat[i + 1][j])
//            l = i + 1;
//        else
//        {
//            ans[0] = i;
//            ans[1] = j;
//            break;
//        }
//    }
//    return ans;
//}

//const int N = 6010;
//
//int n;
//int happy[N];
//int h[N], e[N], ne[N], idx;
//bool has_father[N];
//int f[N][2];
//
//void add(int a, int b)
//{
//    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
//}
//
//void dfs(int u)
//{
//    f[u][1] = happy[u];
//
//    for (int i = h[u]; i != -1; i = ne[i])
//    {
//        int j = e[i];
//        dfs(j);
//
//        f[u][0] += max(f[j][0], f[j][1]);
//        f[u][1] += f[j][0];
//    }
//}
//
//int main()
//{
//    scanf("%d", &n);
//
//    for (int i = 1; i <= n; i++)  scanf("%d", &happy[i]);
//
//    memset(h, -1, sizeof h);
//
//    for (int i = 0; i < n - 1; i++)
//    {
//        int a, b;
//        scanf("%d%d", &a, &b);
//        add(b, a);
//        has_father[a] = true;
//    }
//
//    int root = 1;
//    while (has_father[root]) root++;
//
//    dfs(root);
//
//    printf("%d", max(f[root][0], f[root][1]));
//
//    return 0;
//}

#include<iostream>
#include<cstring>

using namespace std;

const int N = 310;

int dx[4] = { 0,1,-1,0 };
int dy[4] = { 1,0,0,-1 };

int n, m;
int h[N][N];
int f[N][N];

int dp(int x, int y)
{
    int& v = f[x][y];
    if (v != -1) return v;

    v = 1;
    for (int i = 0; i < 4; i++)
    {
        int a = x + dx[i], b = y + dy[i];
        if (a >= 1 && a <= n && b >= 1 && b <= m && h[a][b] < h[x][y])
            v = max(v, dp(a, b) + 1);
    }
    return v;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &h[i][j]);

    memset(f, -1, sizeof f);

    int res = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            res = max(res, dp(i, j));

    printf("%d", res);
    return 0;
}